package com.bootdo.shop.service;

import java.util.List;

import com.bootdo.shop.domain.Calculating;
import com.bootdo.shop.domain.ImputedPrice;
import com.bootdo.shop.domain.OrderInfo;
import com.bootdo.shop.domain.request.OrderInfoReq;
import com.bootdo.shop.domain.response.OrderDetailsRes;
import com.bootdo.shop.domain.response.OrderInfoRes;
import com.bootdo.shop.domain.response.ShoppingCartRes;
import com.bootdo.system.domain.UserDO;
/** 
 * @author 作者 : chenxuan
 * @version 创建时间：2016年1月6日 上午9:38:29 
 * 类说明 
 */
public interface ShopOrderService {
	
	/**
	 * 创建订单
	 * @param orderInfo
	 * @return
	 */
	public OrderInfoRes createOrder(OrderInfoReq orderInfoReq);
	/**
	 * 取消订单
	 * @param orderInfoReq
	 */
	public void cancelOrder(OrderInfoReq orderInfoReq);
	/**
	 * 确认收货
	 * @param orderInfoReq
	 */
	public void confirmReceipt(OrderInfoReq orderInfoReq);
	
	/**
	 * 发货
	 * @param orderInfoReq
	 */
	public void consignment(OrderInfoReq orderInfoReq);
	/**
	 * 支付成功callback
	 * @param orderNo
	 * @param payChannel
	 * @param buyerAccount
	 */
	public void paySuccessCallback(String orderNo,String payChannel,String buyerAccount,String chId);
	
	/**
	 * 计算价格
	 * @param userAddress
	 * @return
	 */
	public ImputedPrice calculatePostage(OrderInfoReq orderInfoReq);
	
	/**
	 * 计算价格
	 * @param list
	 * @param userDO
	 * @return
	 */
	public Calculating  calculatingPrice(List<ShoppingCartRes> list,UserDO userDO);
	/**
	 * 修改订单收货地址
	 * @param orderInfoReq
	 */
	public void updateOrderAddress(OrderInfoReq orderInfoReq);
	/**
	 * 增加订单日志
	 * @param orderId 订单ID
	 * @param orderStatus 订单状态
	 * @param shippingStatus 物流状态
	 * @param payStatus 支付状态
	 * @param actionNote 操作日志
	 * @param actionUser 操作人
	 */
	public void addOrderActionLog(Integer orderId,Integer orderStatus,
			Integer shippingStatus, Integer payStatus,String actionNote,String actionUser);
	/**
	 * 更新订单为支付中
	 * @param orderId 订单ID
	 * @return
	 */
	public OrderInfoRes updateOrderPayStatusForPaymentIn(Integer orderId);
	/**
	 * 限购校验
	 * @param userId 用户ID
	 * @param goodsId 商品ID
	 * @param specificationId 规格ID
	 * @param number 购买数量
	 */
	public void verifyLimitations(Long userId,Integer goodsId,Integer specificationId,Integer number);
	
	/**
	 * 用户订单列表
	 * @return
	 */
	public List<OrderInfoRes> userOrderList(OrderInfoReq orderInfoReq);
	/**
	 * 订单列表总数
	 * @param orderInfoReq
	 * @return
	 */
	public Integer userOrderListCount(OrderInfoReq orderInfoReq);
	/**
	 * 订单详情
	 * @param orderId
	 * @return
	 */
	public OrderInfoRes orderDetail(OrderInfoReq orderInfoReq);
	/**
	 * 根据orderId获取订单
	 * @param orderId
	 * @return
	 */
	public OrderInfo getOrderInfoById(Integer orderId);
	/**
	 * 校验订单能否支付
	 * @param orderId
	 * @return
	 */
	public OrderInfo checkOrderCouldPay(Integer orderId);
	/**
	 * 获取订单详情
	 * @param orderInfoReq
	 * @return
	 */
	public OrderInfoRes getOrderInfoByOrderNo(OrderInfoReq orderInfoReq);
	
	/**
	 * 根据订单号获取订单详情
	 * @param orderNo
	 * @return
	 */
	public OrderInfoRes getOrderInfoByOrderNo(String orderNo);
	
	/**
	 * 根据订单ID获取订单详情列表
	 * @param orderId
	 * @return
	 */
	public List<OrderDetailsRes> getOrderDetailsList(Integer orderId);
	/**
	 * 统计用户待支付、待收货、待评价订单数
	 * @param userId
	 * @return
	 */
	public OrderInfoRes statisticsOrderCount(Integer userId);
	
	/**
	 * 根据订单号列表获取订单
	 * @param orderNoList
	 * @return
	 */
	public List<OrderInfo> getOrderListForOrderNoList(List<String> orderNoList);
	
	/**
	 * 根据第一方订单号查询是否已经有有效订单
	 * @param thirdpartyOrderNo
	 * @return
	 */
	public OrderInfoRes getOrderByThirdpartyOrderNo(String thirdpartyOrderNo);
	
}